// 合并购物车, 获取购物车, 加入购物车
import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  // 在getters中新增：
  // 1. 有效商品列表
  // 2. 选中的购物车商品数据
  // 3. 选中商品总价
  // 4. 购物车中有效商品是否是全部选中状态

  getters: {
    // 有效商品
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 选中的购物车商品
    validSel (state, getters) {
      return getters.validList.filter(good => good.selected)
    },
    // 选中商品总价
    validSelPrice (state, gettres) {
      return gettres.validSel.reduce((acc, good) => (acc += good.nowPrice * good.count), 0)
    },
    // 购物车中有效商品是否是全部选中状态
    isAll (state, getters) {
      return getters.validList.every(good => good.selected)
    }
  },
  mutations: {
    // 修改登录后购物车数据
    setLoglist (state, payload) {
      state.list = payload
    },
    /**
     *
     * @param {*} state  state数据
     * @param {*} good 传入的添加商品
     */
    setList (state, good) {
      // state.value = good
      // 如果是添加的相同skuId就再数量上加1  如果列表里没有相同的skuId, 就push进列表
      const findIndex = state.list.findIndex(item => item.skuId === good.skuId)
      // console.log(findIndex)
      if (findIndex > -1) {
        // 如果有相同id
        state.list[findIndex].count += good.count
      } else {
        state.list.unshift(good)
      }
    },
    // 修改单选按钮
    singleCheck (state, { good, sel }) {
      // 先从列表中找到该商品
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = sel
    },
    // 修改单选框
    allCheck (state, sel) {
      state.list.forEach(item => {
        item.selected = sel
      })
    },
    // 删除
    del (state, good) {
      // console.log(good)
      const currId = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(currId, 1)
    },
    // 修改数量
    numChange (state, { good, num }) {
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.count = num
    }
  },
  actions: {
    // 获取登陆后的列表
    async getLogList ({ commit }) {
      const { result } = await findCartList()
      commit('setLoglist', result)
    },
    // 合并购物车(登陆后立即合并)
    async marginCartAction ({ state, dispatch }) {
      // 判断如果有再合并
      if (state.list.length) {
        // 处理数据
        const cartList = state.list.map(({ skuId, selected, count }) => {
          return {
            skuId, selected, count
          }
        })
        // 传给后台要合并的数据
        await mergeLocalCart(cartList)
        // 获取合并后的列表, 合并成功后从后端获取最新购物车列表替换本地
      }
      dispatch('getLogList')
    },
    // 添加购物车分情况  登录/ 未登录
    async updateCart ({ commit, rootState }, good) {
      if (rootState.user.profile.token) {
        // 登陆后实现加入购物车
        const { result } = await insertCart(good)
        commit('setList', result)
        return '添加成功'
      } else {
        commit('setList', good)
        return '添加成功'
      }
    },
    // 修改单选 分情况  登录/ 未登录
    async singleCheckAction ({ commit, rootState, dispatch }, { good, sel }) {
      if (rootState.user.profile.token) {
        await updateCart({ ...good, selected: sel })
        dispatch('getLogList')
      } else {
        commit('singleCheck', { good, sel })
      }
    },
    // 全选
    async allCheckAction ({ commit, rootState, getters, dispatch }, sel) {
      if (rootState.user.profile.token) {
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: sel, ...ids })
        dispatch('getLogList')
      } else {
        commit('allCheck', sel)
      }
    },
    // 删除
    async delAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        await deleteCart([good.skuId])
        dispatch('getLogList')
        return '删除成功'
      } else {
        commit('del', good)
        return '删除成功'
      }
    },
    // 商品数量
    async numChangeAction ({ commit, rootState, dispatch }, { good, num }) {
      if (rootState.user.profile.token) {
        await updateCart({ ...good, count: num })
        dispatch('getLogList')
      } else {
        commit('numChange', { good, num })
      }
    }
  }
}
